home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / DistUpgrade / utils.py < prev    next >
Text File  |  2009-11-02  |  9KB  |  292 lines

  1. # utils.py 
  2. #  
  3. #  Copyright (c) 2004-2008 Canonical
  4. #  
  5. #  Author: Michael Vogt <mvo@debian.org>
  6. #  This program is free software; you can redistribute it and/or 
  7. #  modify it under the terms of the GNU General Public License as 
  8. #  published by the Free Software Foundation; either version 2 of the
  9. #  License, or (at your option) any later version.
  10. #  This program is distributed in the hope that it will be useful,
  11. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #  GNU General Public License for more details.
  14. #  You should have received a copy of the GNU General Public License
  15. #  along with this program; if not, write to the Free Software
  16. #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  17. #  USA
  18.  
  19. from gettext import gettext as _
  20. import locale
  21. import os
  22. import os.path
  23. import apt_pkg
  24. import urllib2
  25. import subprocess
  26. from stat import *
  27.  
  28. def lsmod():
  29.   " return list of loaded modules (or [] if lsmod is not found) "
  30.   modules=[]
  31.   # FIXME raise?
  32.   if not os.path.exists("/sbin/lsmod"):
  33.     return []
  34.   p=subprocess.Popen(["/sbin/lsmod"], stdout=subprocess.PIPE)
  35.   lines=p.communicate()[0].split("\n")
  36.   # remove heading line: "Modules Size Used by"
  37.   del lines[0]
  38.   # add lines to list, skip empty lines
  39.   for line in lines:
  40.     if line:
  41.       modules.append(line.split()[0])
  42.   return modules
  43.  
  44.  
  45. def check_and_fix_xbit(path):
  46.   " check if a given binary has the executable bit and if not, add it"
  47.   if not os.path.exists(path):
  48.     return
  49.   mode = S_IMODE(os.stat(path)[ST_MODE])
  50.   if not ((mode & S_IXUSR) == S_IXUSR):
  51.     os.chmod(path, mode | S_IXUSR)
  52.  
  53. def country_mirror():
  54.   " helper to get the country mirror from the current locale "
  55.   # special cases go here
  56.   lang_mirror = { 'c'     : '',
  57.                 }
  58.   # no lang, no mirror
  59.   if not os.environ.has_key('LANG'):
  60.     return ''
  61.   lang = os.environ['LANG'].lower()
  62.   # check if it is a special case
  63.   if lang_mirror.has_key(lang[:5]):
  64.     return lang_mirror[lang[:5]]
  65.   # now check for the most comon form (en_US.UTF-8)
  66.   if "_" in lang:
  67.     country = lang.split(".")[0].split("_")[1]
  68.     if "@" in country:
  69.        country = country.split("@")[0]
  70.     return country+"."
  71.   else:
  72.     return lang[:2]+"."
  73.   return ''
  74.  
  75. def get_dist():
  76.   " return the codename of the current runing distro "
  77.   from subprocess import Popen, PIPE
  78.   p = Popen(["lsb_release","-c","-s"],stdout=PIPE)
  79.   res = p.wait()
  80.   if res != 0:
  81.     sys.stderr.write("lsb_release returned exitcode: %i\n" % res)
  82.     return "unknown distribution"
  83.   dist = p.stdout.readline().strip()
  84.   return dist
  85.  
  86. def url_downloadable(uri, debug_func=None):
  87.   """
  88.   helper that checks if the given uri exists and is downloadable
  89.   (supports optional debug_func function handler to support 
  90.    e.g. logging)
  91.  
  92.   Supports http (via HEAD) and ftp (via size request)
  93.   """
  94.   if debug_func:
  95.     debug_func("url_downloadable: %s" % uri)
  96.   import urlparse
  97.   (scheme, netloc, path, querry, fragment) = urlparse.urlsplit(uri)
  98.   if scheme == "http":
  99.     import httplib
  100.     try:
  101.       c = httplib.HTTPConnection(netloc)
  102.       c.request("HEAD", path)
  103.       res = c.getresponse()
  104.       if debug_func:
  105.         debug_func("url_downloadable result '%s'" % res.status)
  106.       res.close()
  107.       if res.status == 200:
  108.         return True
  109.     except Exception, e:
  110.       debug_func("error from httplib: '%s'" % e)
  111.       return False
  112.   elif scheme == "ftp":
  113.     import ftplib
  114.     try:
  115.       f = ftplib.FTP(netloc)
  116.       f.login()
  117.       f.cwd(os.path.dirname(path))
  118.       size = f.size(os.path.basename(path))
  119.       f.quit()
  120.       if debug_func:
  121.         debug_func("ftplib.size() returned: %s" % size)
  122.       if size != 0:
  123.         return True
  124.     except Exception, e:
  125.       if debug_func:
  126.         debug_func("error from ftplib: '%s'" % e)
  127.       return False
  128.   return False
  129.  
  130. def init_proxy(gconfclient=None):
  131.   """ init proxy settings 
  132.  
  133.   * first check for http_proxy environment (always wins),
  134.   * then check the apt.conf http proxy, 
  135.   * then look into synaptics conffile
  136.   * then into gconf  (if gconfclient was supplied)
  137.   """
  138.   SYNAPTIC_CONF_FILE = "/root/.synaptic/synaptic.conf"
  139.   proxy = None
  140.   # generic apt config wins
  141.   apt_pkg.InitConfig()
  142.   if apt_pkg.Config.Find("Acquire::http::Proxy") != '':
  143.     proxy = apt_pkg.Config.Find("Acquire::http::Proxy")
  144.   # then synaptic
  145.   elif os.path.exists(SYNAPTIC_CONF_FILE):
  146.     cnf = apt_pkg.newConfiguration()
  147.     apt_pkg.ReadConfigFile(cnf, SYNAPTIC_CONF_FILE)
  148.     use_proxy = cnf.FindB("Synaptic::useProxy", False)
  149.     if use_proxy:
  150.       proxy_host = cnf.Find("Synaptic::httpProxy")
  151.       proxy_port = str(cnf.FindI("Synaptic::httpProxyPort"))
  152.       if proxy_host and proxy_port:
  153.         proxy = "http://%s:%s/" % (proxy_host, proxy_port)
  154.   # then gconf
  155.   elif gconfclient:
  156.     try: # see LP: #281248
  157.       if gconfclient.get_bool("/system/http_proxy/use_http_proxy"):
  158.         host = gconfclient.get_string("/system/http_proxy/host")
  159.         port = gconfclient.get_int("/system/http_proxy/port")
  160.         use_auth = gconfclient.get_bool("/system/http_proxy/use_authentication")
  161.         if host and port:
  162.           if use_auth:
  163.             auth_user = gconfclient.get_string("/system/http_proxy/authentication_user")
  164.             auth_pw = gconfclient.get_string("/system/http_proxy/authentication_password")
  165.             proxy = "http://%s:%s@%s:%s/" % (auth_user,auth_pw,host, port)
  166.           else:
  167.             proxy = "http://%s:%s/" % (host, port)
  168.     except Exception, e:
  169.       print "error from gconf: %s" % e
  170.   # if we have a proxy, set it
  171.   if proxy:
  172.     # basic verification
  173.     if not proxy.startswith("http://"):
  174.       return
  175.     proxy_support = urllib2.ProxyHandler({"http":proxy})
  176.     opener = urllib2.build_opener(proxy_support)
  177.     urllib2.install_opener(opener)
  178.     os.putenv("http_proxy",proxy)
  179.  
  180. def on_battery():
  181.   """
  182.   Check a dbus signal to org.gnome.PowerManager to not suspend
  183.   the system, this is to support upgrades from pre-gutsy g-p-m
  184.   """
  185.   try:
  186.     import dbus
  187.     bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
  188.     devobj = bus.get_object('org.freedesktop.DeviceKit.Power', 
  189.                             '/org/freedesktop/DeviceKit/Power')
  190.     dev = dbus.Interface(devobj, "org.freedesktop.DBus.Properties")
  191.     return dev.Get("org.freedesktop.DeviceKit.Power", "on_battery")
  192.   except Exception, e:
  193.     #import sys
  194.     #print >>sys.stderr, "on_battery returned error: ", e
  195.     return False
  196.  
  197. def _inhibit_sleep_old_interface():
  198.   """
  199.   Send a dbus signal to org.gnome.PowerManager to not suspend
  200.   the system, this is to support upgrades from pre-gutsy g-p-m
  201.   """
  202.   import dbus
  203.   bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
  204.   devobj = bus.get_object('org.gnome.PowerManager', 
  205.                           '/org/gnome/PowerManager')
  206.   dev = dbus.Interface(devobj, "org.gnome.PowerManager")
  207.   cookie = dev.Inhibit('UpdateManager', 'Updating system')
  208.   return (dev, cookie)
  209.  
  210. def _inhibit_sleep_new_interface():
  211.   """
  212.   Send a dbus signal to gnome-power-manager to not suspend
  213.   the system
  214.   """
  215.   import dbus
  216.   bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
  217.   devobj = bus.get_object('org.freedesktop.PowerManagement', 
  218.                           '/org/freedesktop/PowerManagement/Inhibit')
  219.   dev = dbus.Interface(devobj, "org.freedesktop.PowerManagement.Inhibit")
  220.   cookie = dev.Inhibit('UpdateManager', 'Updating system')
  221.   return (dev, cookie)
  222.  
  223. def inhibit_sleep():
  224.   """
  225.   Send a dbus signal to power-manager to not suspend
  226.   the system, try both the new freedesktop and the
  227.   old gnome dbus interface
  228.   """
  229.   try:
  230.     return _inhibit_sleep_old_interface()
  231.   except Exception, e:
  232.     try:
  233.       return _inhibit_sleep_new_interface()
  234.     except Exception, e:
  235.       #print "could not send the dbus Inhibit signal: %s" % e
  236.       return (False, False)
  237.  
  238. def allow_sleep(dev, cookie):
  239.   """Send a dbus signal to gnome-power-manager to allow a suspending
  240.   the system"""
  241.   try:
  242.     dev.UnInhibit(cookie)
  243.   except Exception, e:
  244.     print "could not send the dbus UnInhibit signal: %s" % e
  245.  
  246.  
  247. def str_to_bool(str):
  248.   if str == "0" or str.upper() == "FALSE":
  249.     return False
  250.   return True
  251.  
  252. def utf8(str):
  253.   return unicode(str, 'latin1').encode('utf-8')
  254.  
  255. def error(parent, summary, message):
  256.   import gtk
  257.   d = gtk.MessageDialog(parent=parent,
  258.                         flags=gtk.DIALOG_MODAL,
  259.                         type=gtk.MESSAGE_ERROR,
  260.                         buttons=gtk.BUTTONS_CLOSE)
  261.   d.set_markup("<big><b>%s</b></big>\n\n%s" % (summary, message))
  262.   d.realize()
  263.   d.window.set_functions(gtk.gdk.FUNC_MOVE)
  264.   d.set_title("")
  265.   res = d.run()
  266.   d.destroy()
  267.   return False
  268.  
  269. def humanize_size(bytes):
  270.     """
  271.     Convert a given size in bytes to a nicer better readable unit
  272.     """
  273.     if bytes == 0:
  274.         # TRANSLATORS: download size is 0
  275.         return _("0 KB")
  276.     elif bytes < 1024:
  277.         # TRANSLATORS: download size of very small updates
  278.         return _("1 KB")
  279.     elif bytes < 1024 * 1024:
  280.         # TRANSLATORS: download size of small updates, e.g. "250 KB"
  281.         return locale.format(_("%.0f KB"), bytes/1024)
  282.     else:
  283.         # TRANSLATORS: download size of updates, e.g. "2.3 MB"
  284.         return locale.format(_("%.1f MB"), bytes / 1024 / 1024)
  285.  
  286. if __name__ == "__main__":
  287.   #print mirror_from_sources_list()
  288.   print on_battery()
  289.